package com.heima.stroke.rabbitmq;


import com.alibaba.fastjson.JSON;
import com.heima.modules.vo.StrokeVO;
import com.heima.stroke.configuration.RabbitConfig;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;


@Component//这是 Spring 的注解，标记这个类是一个组件，会被 Spring 自动扫描并管理//可以理解为 "告诉系统这是一个可重用的工具类"
public class MQProducer {//定义一个公开的类，类名叫 MQProducer（消息生产者的意思）
    private final static Logger logger = LoggerFactory.getLogger(MQProducer.class);//创建一个日志记录器（logger），用于打印日志信息//LoggerFactory.getLogger(MQProducer.class)表示这个日志器属于 MQProducer 类，打印日志时会标记来源
    @Autowired
    RabbitTemplate rabbitTemplate;//RabbitTemplate：RabbitMQ 提供的工具类，用于发送消息到队列

    /**
     * 发送延时订单MQ
     *
     * @param strokeVO
     */
    public void sendOver(StrokeVO strokeVO) {//方法名是 sendOver（发送超时消息的意思）//参数是StrokeVO strokeVO：表示要发送的行程相关数据（StrokeVO 是一个存储行程信息的对象）
        String mqMessage = JSON.toJSONString(strokeVO);//把行程数据（strokeVO 对象）转换成 JSON 格式的字符串//因为消息队列只能传递字符串或字节数据，所以需要把对象转成 JSON 字符串
        logger.info("send timeout msg:{}",mqMessage);//打印一条日志，内容是 "send timeout msg:" 加上刚才转换的 JSON 消息
        //TODO:任务4.2-发送邀请消息
        // 发送消息到超时队列，30秒后自动转到死信队列
        rabbitTemplate.convertAndSend(//这是发送消息的核心方法，convertAndSend表示 "转换并发送"
                RabbitConfig.STROKE_OVER_QUEUE_EXCHANGE,//指定要发送到哪个交换器（这里用了之前定义的行程超时队列交换器）
                RabbitConfig.STROKE_OVER_KEY,//指定路由键（用了之前定义的行程超时路由键）
                mqMessage//要发送的实际消息内容（就是前面转换的 JSON 字符串）
        );
    }


}
